/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package tetris.model.navigation;

/**
 * Direction - абстракция направления в системе координат "север-юг-восток-запад"; 
 * позволяет сравнивать направления и порождать новые направления относительно 
 * текущего
 */
public class Direction {
    
    // определяем направление как угол в градусах от 0 до 360
    private int _angle = 90;
    
    private Direction(int angle) {
        // Приводим заданный угол к допустимому диапазону 
        angle = angle%360;
        if(angle < 0)    angle += 360;
        
        this._angle = angle;
    }
    
    // ------------------ Возможные направления ---------------------
    
    /**
     * Направление вниз.
     * @return направление.
     */
        
    public static Direction down()
    { return new Direction(270); }

    /**
     * Направление вправо.
     * @return направление.
     */
    public static Direction right()
    { return new Direction(0); }

    /**
     * Направление влево.
     * @return направление.
     */
    public static Direction left()
    { return new Direction(180); }
    
    /**
     * Функция сравнения направлений.
     * @param other другое направление.
     * @return результат.
     */
    @Override
    public boolean equals(Object other) {

        if(other instanceof Direction) {
            // Типы совместимы, можно провести преобразование
            Direction otherDirect = (Direction)other;
            // Возвращаем результат сравнения углов
            return  _angle == otherDirect._angle;
        }
        
        return false;
    }
    
    /**
     * Хеш-код.
     * @return Хеш-код направления.
     */
    @Override
    public int hashCode() {
        return this._angle;
    }
}
